筆記目錄

Skip to content

淺談 SQL Server WHERE 子句的 NULL 判斷

TLDR

  • 在 SQL 中判斷欄位是否為 NULL,必須使用 IS NULLIS NOT NULL,使用 = NULL 會導致查詢結果不符合預期。
  • SQL 的邏輯運算結果包含 TRUEFALSEUNKNOWN 三種狀態。
  • WHERE 子句僅會篩選出結果為 TRUE 的資料列。
  • 任何值(包含 NULL 本身)與 NULL 進行比較,結果皆為 UNKNOWN
  • 建議在查詢條件中盡量避免產生 UNKNOWN 狀態,以確保邏輯明確。
  • SQL Server 官方建議使用 <> 作為不等於運算子,儘管部分環境支援 !=

NULL 的比較邏輯與 UNKNOWN 狀態

什麼情況下會遇到這個問題:當開發者嘗試使用 = 運算子來篩選資料庫中為 NULL 的欄位時。

在 SQL 中,NULL 代表「未知的值」。因此,任何值與 NULL 進行比較(例如 Column = NULL),其結果並非 TRUEFALSE,而是 UNKNOWN。由於 WHERE 子句僅會回傳邏輯判斷為 TRUE 的資料列,這導致使用 = NULL 的查詢永遠無法撈出正確資料。

UNKNOWN 的邏輯運算規則

為了避免邏輯錯誤,需了解 UNKNOWN 在布林運算中的行為:

  • AND 運算:

    • TRUE AND UNKNOWN = UNKNOWN
    • UNKNOWN AND UNKNOWN = UNKNOWN
    • FALSE AND UNKNOWN = FALSE
  • OR 運算:

    • TRUE OR UNKNOWN = TRUE
    • UNKNOWN OR UNKNOWN = UNKNOWN
    • FALSE OR UNKNOWN = UNKNOWN

結論與建議

  • 務必使用 IS NULLIS NOT NULL 來判斷空值。
  • 避免在 WHERE 條件中撰寫會產生 UNKNOWN 的複雜邏輯,以防查詢結果被過濾掉。

SQL Server 的不等於運算子

什麼情況下會遇到這個問題:在撰寫 SQL 查詢時,不確定該使用 <> 還是 !=

雖然 SQL Server 支援 != 語法,但根據官方文件,<> 才是標準的 ANSI SQL 不等於運算子。為了保持程式碼的可移植性與符合標準規範,建議優先使用 <>

  • 推薦做法:使用 <> 進行不等於判斷。
  • 注意事項:部分舊版或特定資料庫系統(如 Microsoft Access)可能不支援 !=

參考資料

異動歷程

  • 2024-07-24 初版文件建立。